package ThreadingSafety;

/**
 *
 * Date: 2022-09-12  9月8 01:51:00时的课程内容
 * Time: 12:42
 *
 *    关于 "死锁"问题: (在此讨论的是同一个线程同一把锁连续加锁的情况,其他情况后续再介绍)
 *      不会产生死锁的话,这样的锁叫做 "可重入锁",
 *      会产生死锁的话,这样的锁叫做 "不可重入锁"..
 *
 * synchronized 是可重入的. -> 只要让锁里记录好, 是哪个线程持有的这把锁即可.
 *    例如 : t 线程尝试针对 this 来加锁, this这个锁里就记录了是t线程持有了它, 第二次
 *          进行加锁的时候, 只要还是t线程,就直接通过, 不会阻塞等待:
 *
 *          synchronized(this) {   //加锁
 *              synchronized(this) { //直接放行, 不阻塞
 *                  代码.
 *              }  //执行到这行代码,要不要真解锁 ? 不要 !!!! 那么该如何处理呢 ?
 *          }       //引入一个计数器, 每次加锁计数器++, 每次解锁,计数器--,
 *                  //如果计数器为0,此时的加锁才是真加锁; 同样计数器为0,此时的解锁才是真解锁!!
 *
 *    [总结]可重入锁的实现要点:
 *      1. 让锁里持有线程对象, 记录谁加了锁;
 *      2. 维护一个计数器, 用来衡量 啥时候是真加锁, 啥时候是真解锁, 啥时候是直接放行.
 *      3. 以上所述 synchronized 已经处理好了! 我们放心用 即可 !!
 */
public class Demo14Child {
    public static void main(String[] args) {
        System.out.println("synchronized 的 可重入性");
    }
}

// 接下来的 TestDemo15 将介绍 内存可变性 !!
